Unity2022から公式でSpriteToolが利用できるようになりました
僕ま今まで曲線に沿ったオブジェクトの配置、移動はCinemachineの CinemachineSmoothPath などを利用して曲線を作成し、それに沿ってオブジェクトの配置をしていました
(ようやく)公式で使えるようになったということでその使い方をリファレンスから読み取ろうと思います
はじめに
Sprinesパッケージは現在の最新版である 1.0.1 を利用します
https://docs.unity3d.com/Packages/com.unity.splines/manual/index.html
(公式にはPreview版の2.0.0があるように見えますがUPMからは見えないため、1.0.1を利用します)
このパッケージにはスプラインを作成、編集、アセット保存、作成したスプラインに沿ったPostiion,Rotationを取得できる機能、サンプルが含まれます
利用できる環境は2022.1以降。今回は 2022.1.15f1 で利用
PackageManagerからUnity公式の Splines パッケージをインストール (Sampleは任意)
パスの編集
GameObject > 3D Object > Spline の中に
- Draw Spline TOol
- Square
- Circle
Square と Circle はデフォルトで四角、丸のSplineを設定してあるデータを生成してくれます
この頂点データを編集するにはSceneViewの Scene Tool Override で表示されているSpline編集ツールを利用します
こちらを押すとEditモードになり頂点をSceneViewから編集することができます
Sphere や Circle のようにSplineがループしているのは Closed にチェックが入っているからであり、一本の線を描く場合はチェックを下ろします
マウスでクリックした点に新しいポイントを追加するには Knot Placement Toolを利用します
こちらをOnにした状態でSceneViewをクリックするとそのポイントがリストに追加されます。 ポイント地点にMeshObjectが存在する場合その表面に吸い付くようにポイントが配置されます
Escで編集モードを終了します
パスに沿ってオブジェクトを動かす
Splineは引いたパスから「座標」、「回転値」を求められます こちらを利用してパス上にオブジェクトを動かします
SplineはSplineContainerクラスのため、Serializefieldで値を取得します。
Evalute メソッドを利用することで t (パス全体を0~1とする)を入力値とし、その時の座標、前方ベクトル、垂直ベクトルを取得できます
これを利用し、毎フレーム SetPositionAndRotationでオブジェクトを動かしてみます
public class SplineTest : MonoBehaviour
{
// Splineの設定
[SerializeField] private SplineContainer _spline;
private float _current;
private float _length;
private void Start()
{
_length = _spline.CalculateLength();
}
private void Update()
{
_current += Time.deltaTime * 0.3f;
var t = Mathf.Min(_current, _length) / _length;
// 座標、回転値を求める
_spline.Evaluate(t, out var pos, out var tangent, out var upVector);
var rotation = Quaternion.LookRotation(Vector3.Normalize(tangent), upVector);
transform.SetPositionAndRotation(pos, rotation);
}
}
簡単にパス上にオブジェクトを配置できました
また、 SplineAnimateを利用することでオブエジェクト移動を簡単に利用でき、かつループ処理や移動にイージングを適用することもできます
こちらはまた別の記事で紹介したいと思います